//
//  HHStatusListViewModel.swift
//  HHWeibo
//
//  Created by hehuafeng on 2017/2/21.
//  Copyright © 2017年 雷厉峰行. All rights reserved.
//

import Foundation
import YYModel

/// 上拉刷新最多失败次数
private let maxPullupTryTimes = 3

class HHStatusListViewModel {
    
    /// 懒加载: 微博模型数组
    lazy var statusList: [HHStatus] = [HHStatus]()
    
    /// 上拉刷新已经失败的次数
    private var pullupErrorTimes = 0
    
    
    /// 加载微博数据
    ///
    /// - Parameter pullup: 上拉刷新标记
    ///   - completion: 完成回调闭包
    func loadStatus(pullup: Bool, completion: @escaping (_ isSuccess: Bool, _ shoudleRefersh: Bool) -> ()) {
        // 如果上拉刷新失败次数大于最大次数, 则停止刷新
        if pullup && pullupErrorTimes > maxPullupTryTimes {
            // 执行回调闭包
            completion(true, false)
            
            // 返回
            return
        }
        
        // 0. 获取当前最新的微博动态的编号
        // 下拉刷新
        let since_id = !pullup ? (statusList.first?.id ?? 0) : 0
        
        // 上拉刷新
        let max_id = pullup ? (statusList.last?.id ?? 0) : 0
        
        
        // 1. 发送网络请求获取数据
        HHNetworkManager.shared.statusList(since_id: since_id, max_id: max_id) { (list, isSuccess) in
            // 2. 字典转模型
            guard let array = NSArray.yy_modelArray(with: HHStatus.self, json: list) as? [HHStatus] else {
                // 执行完成回调
                completion(isSuccess, false)
                
                return
            }
            
            // FIXME: 3. 拼接数据
            if pullup {  // 上拉刷新
                self.statusList += array
                
            }else {  // 处理下拉刷新
               self.statusList = array + self.statusList
            }
            
            print("下拉加载 \(array.count)条数据")
            
            // 记录上拉刷新失败次数
            if pullup && array.count == 0 {
                // 记录上拉刷新失败
                self.pullupErrorTimes += 1
                
                // 执行回调闭包
                completion(isSuccess, false)
                
            }else {
                // 执行完成回调
                completion(isSuccess, true)
            }
            
        }
    }
    
}
